package bomberman.vista;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import bomberman.controlador.ControladorDeTeclas;
import bomberman.modelo.NuestroGameLoop;
import bomberman.modelo.Partida;

import fiuba.algo3.titiritero.dibujables.SuperficiePanel;
import fiuba.algo3.titiritero.modelo.SuperficieDeDibujo;

public class VentanaPrincipal{
	private JFrame frame;
	private Partida partida; 
	private ControladorDeTeclas keyListener;
	private NuestroGameLoop gameLoop;
	private boolean juegoIniciado = false;
	private static JLabel jLabelVidas;
	private static JLabel jLabelPuntos;
	private static JLabel jLabelNivel;

	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					VentanaPrincipal window = new VentanaPrincipal();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	public VentanaPrincipal() {
		try {
			initialize();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static JLabel getLabelVidas(){
		return jLabelVidas;
	}
	
	public static JLabel getLabelPuntos(){
		return jLabelPuntos;
	}

	public static JLabel getLabelNivel(){
		return jLabelNivel;
	}
	
	private void initialize() throws IOException {		  
	    frame = new JFrame("Bombita Rodriguez contra los enemigos de la Nacion");
	    frame.setForeground(new Color(0, 0, 0));
	    frame.setBounds(100, 100, 750, 700);
	    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    frame.getContentPane().setLayout(null);
    
	    jLabelVidas = new JLabel();
	    jLabelPuntos = new JLabel();
	    jLabelNivel = new JLabel();
	    
	    JPanel panel = new SuperficiePanel();
	    panel.setBackground(new Color(0, 0, 0));
	    panel.setBounds(42, 53, 600, 600);
	    frame.getContentPane().add(panel);

	    this.gameLoop = new NuestroGameLoop(275, (SuperficieDeDibujo) panel);
	    partida = new Partida(gameLoop);
    
	    JButton btnIniciar = new JButton("Nuevo");
	    btnIniciar.addActionListener(new ActionListener() {
	    	public void actionPerformed(ActionEvent arg0) {
	    		if (gameLoop.estaEjecutando()){
	    			gameLoop.detenerEjecucion();
	    		}
	    	
	    		// Se crea otro game loop para la nueva partida
		    	gameLoop = gameLoop.reiniciar();
		    	
		    	partida = new Partida(gameLoop);
				gameLoop.iniciarEjecucion();
				
				keyListener.setBombita(partida.getNivelActual().getBombita());
				juegoIniciado = true;
		        frame.requestFocus();
	    	}
	    });
	        
	    JButton btnCargar = new JButton("Cargar");
	    btnCargar.addActionListener(new ActionListener() {
	      public void actionPerformed(ActionEvent arg0) {
		    	if (gameLoop.estaEjecutando()) {
		    		gameLoop.detenerEjecucion();
		      	}
		    	    	  
				// Se pide al usuario que ingrese el archivo a cargar  
		    	String filename = ".";
		    	JFileChooser fc = new JFileChooser(new File(filename));
		    	fc.showOpenDialog(frame);
		    	File selFile = fc.getSelectedFile();
		    	
		    	// Se crea otro game loop para la partida a cargar
		    	gameLoop = gameLoop.reiniciar();
		    	
				partida = Partida.cargarPartidaDeXML(selFile, gameLoop);
				
				gameLoop.iniciarEjecucion();
				
				keyListener.setBombita(partida.getNivelActual().getBombita());
				juegoIniciado = true;
				frame.requestFocus();
	      	}
	    });
	        
	    JButton btnGuardar = new JButton("Guardar");
	    btnGuardar.addActionListener(new ActionListener() {
	    	public void actionPerformed(ActionEvent arg0) {
	    		if (!gameLoop.estaEjecutando()) {
	    			return;  
	    		}
	    	 
	    	  	gameLoop.detenerEjecucion();
	    	  
				// Se pide al usuario que ingrese el nombre de archivo y ruta en la que guardar
				String filename = ".";
				JFileChooser fc = new JFileChooser(new File(filename));
				fc.showSaveDialog(frame);    	
				File selFile = fc.getSelectedFile();
				
				// Se guarda el juego
				try {
					partida.serializar(selFile);
				} catch (IOException e) {
					e.printStackTrace();
				}
	
				// Se reinicia la ejecucion
				frame.requestFocus();
				gameLoop.iniciarEjecucion();
	    	}
	    });
	    
	    JButton btnDetener = new JButton("Pausar");
	    btnDetener.addActionListener(new ActionListener() {
	    	public void actionPerformed(ActionEvent e) {
	    		if (!juegoIniciado) {
		        	return;  
		      	}
	    		if (gameLoop.estaEjecutando()){
	    			gameLoop.detenerEjecucion();   
	    		}else {
	    		  frame.requestFocus();
	    			gameLoop.iniciarEjecucion();
	    		}
		    }
	    });
	       
	    // Agrego los contadores de puntos
	    jLabelVidas.setBounds(650, 90, 92, 25);
	    jLabelVidas.setText("Vidas:   " + partida.getVidasRestantes());
	    jLabelVidas.setFocusable(false);
	    frame.getContentPane().add(jLabelVidas);
	    
	    jLabelPuntos.setBounds(650, 120, 92, 25);
	    jLabelPuntos.setText("Puntos: " + partida.getPuntos());
	    jLabelPuntos.setFocusable(false);
	    frame.getContentPane().add(jLabelPuntos);
	    
	    jLabelNivel.setBounds(650, 60, 92, 25);
	    jLabelNivel.setText("Nivel: " + partida.getNumeroDeNivelActual());
	    jLabelNivel.setFocusable(false);
	    frame.getContentPane().add(jLabelNivel);
	    
	    // Agrego los botones
	    btnIniciar.setBounds(42, 16, 92, 25);
	    btnIniciar.setFocusable(false);
	    frame.getContentPane().add(btnIniciar);
	    
	    btnCargar.setBounds(200, 16, 92, 25);
	    btnCargar.setFocusable(false);
	    frame.getContentPane().add(btnCargar);
	    
	    btnGuardar.setBounds(400, 16, 92, 25);
	    btnGuardar.setFocusable(false);
	    frame.getContentPane().add(btnGuardar);
	    
	    btnDetener.setBounds(550, 16, 92, 25);
	    btnDetener.setFocusable(true);
	    frame.getContentPane().add(btnDetener);
	    
	    // Agrego el controlador
	    keyListener = new ControladorDeTeclas(partida.getNivelActual().getBombita());
		frame.addKeyListener(keyListener);
		frame.setFocusable(true);
	}
}